// 添加 JsonDB 引用
const JsonDB = require("../json-db");
const path = require("path");
const fs = require("fs").promises;

// 将初始化数据库的代码提取为单独的函数
async function initializeDB() {
  const dataPath = path.resolve("./data");
  console.log("数据库存储路径:", dataPath);

  return new JsonDB({
    storage: {
      path: dataPath,
      mode: "hybrid",
    },
    backup: {
      enabled: true,
      interval: 3600000,
      keepCount: 5,
    },
    logger: {
      level: "debug",
      file: path.join(dataPath, "db.log"),
      console: true,
    },
  });
}

// 查询测试函数
async function runTests(db) {
  try {
    console.log("开始执行查询测试...");

    // 检查表信息
    const tableInfo = await db.获取表信息('学员成绩表');
    console.log("获取到的表信息:", tableInfo);

    // 第一个测试：输出所有18岁以上学生的信息
    const over18Students = await db.查询数据({
      表名: "学员成绩表",
      列: ["学号", "姓名", "性别", "年龄", "班级"],
      条件: {
        年龄: { 大于: 17 },
      },
    });

    console.log("\n18岁以上学生信息:\n", over18Students.results[0]);
    console.log("...");

    // 第二个测试：输出所有语言成绩 80分以下的男同学
    const lowScoreBoys = await db.查询数据({
      表名: "学员成绩表",
      列: ["学号", "姓名", "语文", "数学", "总分"],
      条件: {
        性别: { 等于: "男" },
        语文: { 小于: 80 },
      },
      计算列: {
        总分: "语文 + 数学 + 英语 + 物理 + 化学 + 生物",
      },
      排序: {
        语文: "降序",
        数学: "降序",
      },
    });
    console.log(
      "\n语文成绩80分以下的男同学(按语文、数学成绩降序排列):\n",
      lowScoreBoys.results
    );

    // 第三个测试：输出所有女生总分排名
    const girlTotalScoreRank = await db.查询数据({
      表名: "学员成绩表",
      列: ["学号", "姓名", "总分", "语文", "数学"],
      计算列: {
        总分: "语文 + 数学 + 英语 + 物理 + 化学 + 生物",
      },
      条件: {
        性别: { 等于: "女" },
      },
      排序: {
        总分: "降序",
        语文: "降序",
      },
    });

    console.log(
      "\n女生成绩排名(按总分、语文成绩降序排列):\n",
      girlTotalScoreRank.results
    );

    // 第四个测试：输出总分高于所有人总分的平均分且年龄大于17岁的男生
    const highScoreBoys = await db.查询数据({
      表名: "学员成绩表",
      列: ["姓名", "语文", "总分", "平均分"],
      计算列: {
        总分: "语文 + 数学 + 英语 + 物理 + 化学 + 生物",
      },
      聚合: {
        平均分: {
          类型: "avg",
          列: "总分",
        },
      },
      条件: {
        性别: { 等于: "男" },
        年龄: { 大于: 17 },
        总分: { 大于: "平均分" },
      },
      排序: {
        总分: "降序",
        语文: "降序",
      },
    });
    console.log("\n总分高于平均分且年龄大于17岁的男生:");
    console.log("符合条件的学生:", highScoreBoys.results);

    // 统计测试
    const stats = await db.查询数据({
      表名: "学员成绩表",
      列: ["总人数", "平均分", "最高分", "最低分"],
      计算列: {
        总分: "语文 + 数学 + 英语 + 物理 + 化学 + 生物"
      },
      聚合: {
        总人数: {
          类型: "count",
          列: "*"
        },
        平均分: {
          类型: "avg",
          列: "总分"
        },
        最高分: {
          类型: "max",
          列: "总分"
        },
        最低分: {
          类型: "min",
          列: "总分"
        }
      }
    });
    console.log("\n统计结果:", stats.results);

  } catch (error) {
    console.error("测试失败:", error.message);
    if (error.code === "ENOENT") {
      console.error("找不到文件，请确保目录存在且有正确的权限");
    }
  }
}


// 主函数
async function main() {
  try {
    const db = await initializeDB();
    await runTests(db);
  } catch (error) {
    console.error("执行失败:", error);
  }
}

// 运行主函数
main().catch((error) => {
  console.error("程序执行失败:", error);
}); 